package com.cloudcc.cloudframe.net.async;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import com.cloudcc.cloudframe.net.CanCheckable;
import com.cloudcc.cloudframe.net.ErrorInfo;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;

/** 
* @Description: 泛型自动解析 json数据的请求 
* @author wangzhiqiang
* @date 2015-11-24 下午2:33:15 
* 
* @param <T> 
*/
public abstract class GenericsRequest<T> extends JsonRequest implements CanCheckable {
	
	@Override
	public void handleSuccess(JsonObject json, String resp) {
		//获得父类的泛型 这个地方使用的时候注意  this 当前是子类的 所以 如果直接使用 GenericsRequest 一定要 {} 创建一个子类
		ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
		Type type = genericSuperclass.getActualTypeArguments()[0];
		TypeToken<?> typeToken = TypeToken.get(type);
		JsonElement jsonElement = json.get(getUsefullNode());
		T data = null;
		try {
			data = new Gson().fromJson(jsonElement, typeToken.getType());
		} catch (JsonSyntaxException e) {
			handleFailure(ErrorInfo.get(JSON_PARSER_ERROR));
			return;
		}
		if (data == null) {
			handleFailure(ErrorInfo.get(JSON_PARSER_ERROR));
		} else {
			handleSuccess(data);
		}
	}
	/**
	 * json数据的额存储节点
	 * 
	 * @return 默认是data 可以自定义
	 */
	protected String getUsefullNode() {
		return "data";
	}
	/** 成功
	 * @param data
	 */
	public abstract void handleSuccess(T data);
	
	@Override
	public void onCheckFinish(boolean isOk,int code,String message) {
		if (!isOk) {
			handleFailure(ErrorInfo.get(code, message));
		}
	}
	

}
